# -*- coding: utf-8 -*-

from damas import utils
import random
from time import sleep
import cmd

class MoveCmd(cmd.Cmd, object):

    _movimentos_validos = []
    _movimento = None
    prompt = 'Digite a coordenada para executaro movimento (TAB para mostrar movimentos válidos!)\n'

    def set_movimentos(self, movimentos):
        self._movimento = None
        self._movimentos_validos = movimentos

    def get_movimento(self):
        return self._movimento

    def complete_movimento(self, texto, linha, begidx, endidx):
        return [i for i in self._movimentos_validos if i.startswith(texto)]

    def completenames(self, texto, linha, begidx, endidx):
        return self.complete_movimento(texto, linha, begidx, endidx)

    completedefault = completenames


    def do_movimento(self, movimento):
        if movimento in self._movimentos_validos:
            self._movimento = movimento
            return True
        return False

    def onecmd(self, linha):
        linha = 'movimento ' + linha
        r = super(MoveCmd, self).onecmd(linha)
        return r


mover = MoveCmd()

_registry = {}

def register(name, jogador):
    _registry[name] = jogador

def get_jogador(name, default=None):
    return _registry.get(name, default)

def formata_movimentos(movimentos):
    res = []
    for movimento in movimentos:
        start, end, steps, taken = movimento
        res.append('%s%s-%s%s' % (start[0], start[1], end[0], end[1]))
    return res

def exibe_movimentos(movimentos):
    res = formata_movimentos(movimentos)
    for movimento in res:
        print movimento

def comando_jogador(jogo, estado):
    """Move a peça do jogador segundo as coordenadas
    """
    movimento = None
    mover.set_movimentos(formata_movimentos(estado.movimentos))
    while movimento is None:
        mover.cmdloop()
        movimento = mover.get_movimento()
        movimento = '%s:%s' % (estado.to_movimento, movimento)
        try:
            movimento = utils.parse_movimento(movimento)
        except ValueError:
            movimento = None
            continue
        jogador = movimento[0]
        movimento = movimento[1:]
        movimentos_validos = estado.movimentos
        movimento = busca_movimento(movimentos_validos, movimento)
    return movimento

register('comando', comando_jogador)


def rede_jogador(jogo, estado):
    """Move a peça do jogador segundo as coordenadas
    """
    movimento = None
    mover.set_movimentos(formata_movimentos(estado.movimentos))
    while movimento is None:
        mover.cmdloop()
        movimento = mover.get_movimento()
        movimento = '%s:%s' % (estado.to_movimento, movimento)
        try:
            movimento = utils.parse_movimento(movimento)
        except ValueError:
            movimento = None
            continue
        jogador = movimento[0]
        movimento = movimento[1:]
        movimentos_validos = estado.movimentos
        movimento = busca_movimento(movimentos_validos, movimento)
    return movimento

register('rede', rede_jogador)

"""
def rede_jogador(jogo, estado,**kw):
    s = kw['kw']
            
    while 1:
        jogo = s.recv(1024)
        estado = s.recv(1024)
        print jogo

        msg = raw_input('digite a mensagem: ')
        movimento = '%s:%s' % (estado.to_movimento, msg)
        try:
            movimento = utils.parse_movimento(movimento)
        except ValueError:
            movimento = None
            continue
        jogador = movimento[0]
        movimento = movimento[1:]
        movimentos_validos = estado.movimentos
        s.send(str(movimento))
                
    print "saindo..."
    time.sleep(1)
    s.close()


register('rede', rede_jogador)
"""

def busca_movimento(movimentos, movimento):
    for m in movimentos:
        if m[:2] == movimento[:2]:
            return m
    # não achou coordenadas
    for m in movimentos:
        if m[:1] == movimento[:1]:
            return m
    return None 

class Jogador:

    def __init__(self, jogada, **kw):
        self.jogada = jogada
        self.kw = kw
    def __call__(self, jogo, estado, **kw):
        kw.update(self.kw)
        kw['jogo'] = jogo
        kw['estado'] = estado
        jogo.exibe_tabuleiro(estado)
        movimento = self.jogada(**kw)
        return movimento
